﻿# Makefile 语法说明：
# 1. 变量定义：变量名 = 值
# 2. 自动变量：
#    $@ - 表示规则中的目标文件名
#    $< - 表示第一个依赖文件名
#    $^ - 表示所有依赖文件列表
# 3. 函数：
#    $(addprefix 前缀, 名称列表) - 给名称列表中的每个名称添加前缀
#    $(wildcard 模式) - 查找匹配模式的文件
#    $(patsubst 模式,替换,文本) - 模式替换
# 4. 模式规则：
#	 %.o: %.cpp 表示如何从 .cpp 生成 .o
# 5. 常用目标：
#    all - 默认目标
#    clean - 清理生成的文件
#    install - 安装程序

# 定义可执行程序的名称
target = client

# 定义源文件
sources = client_main.cpp \
	client.cpp \
	TimeBase.cpp \
	MySHA256.c

# 定义对象文件，每一个源文件对应一个对象文件，输出到 makefileTemp 目录
objects = $(addprefix makefileTemp/, $(patsubst %.cpp,%.o,$(filter %.cpp,$(sources)))) \
          $(addprefix makefileTemp/, $(patsubst %.c,%.o,$(filter %.c,$(sources))))

# 定义编译器
compiler = g++

# 定义编译选项（如果有警告不需要，可以禁用）
options = -Wall -Wextra -std=c++11 -g
# 常见的编译选项及其功能说明：
# 	-o 输出文件名：指定编译后的可执行文件或目标文件的名称。例如，gcc -o myprogram myprogram.c 会将 myprogram.c 编译成名为 myprogram 的可执行文件。

# 	-c：只编译不链接。编译器将源代码编译成目标文件，而不是可执行文件。例如，gcc -c myprogram.c 将生成 myprogram.o 目标文件。

# 	-g：在可执行文件中包含调试信息，以便使用调试器（如GDB）调试程序。

# 	-O.setLevel：启用优化。不同的优化级别会有不同的优化效果，常见的有-O0（不优化）、-O1、-O2、-O3（最高优化级别），以及-Os（优化代码大小）。

# 	-Wall：启用所有警告信息，帮助开发者发现潜在的问题。

# 	-I目录：添加头文件搜索路径。当编译器需要查找某个头文件时，会在这个目录中搜索。例如，gcc -I/path/to/include myprogram.c在编译时会到指定路径查找头文件。

# 	-L目录：添加库搜索路径。用于指定链接库文件时的搜索路径。例如，gcc -L/path/to/lib myprogram.c在链接时会到指定路径查找库文件。

# 	-l库名：链接库。告诉编译器需要链接哪个库文件。例如，gcc -lm myprogram.c 会链接数学库 libm。

# 	-D宏定义：定义宏。在编译前给代码定义一些宏，方便条件编译。例如，gcc -DDEBUG myprogram.c 会在编译时定义一个名为 DEBUG 的宏。

# 	-Werror：将警告视为错误处理，即遇到警告时停止编译。


# 定义库选项（如果需要）
libs = 

# 确保 makefileTemp 目录存在
$(shell mkdir -p makefileTemp)

# 编译目标
$(target): $(objects)
	$(compiler) $(objects) -o $(target) $(libs)

# 规则：编译 .cpp 文件生成 .o 文件，输出到 makefileTemp 目录
makefileTemp/%.o: %.cpp
	$(compiler) $(options) -c $< -o $@

# 规则：编译 .c 文件生成 .o 文件，输出到 makefileTemp 目录
makefileTemp/%.o: %.c
	gcc $(options) -c $< -o $@


# 清理目标
clean:
	sudo rm -f  $(objects)
	sudo rm -f  $(target)
	sudo rm -rf makefileTemp/.o
	sudo rm -rf makefileTemp
	sudo rm -f  *.o

# 查看帮助信息
detail:
	@echo "Usage:"
	@echo "  make       - 编译生成可执行文件"
	@echo "  make clean - 清理生成的文件"
	@echo "  make help  - 查看帮助信息"
